package com.woniuxy.interceptor;

import com.woniuxy.annotations.RequireRoles;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;


/**
 * @Author: hlf
 * @Description: 认证角色注解的拦截器: 识别方法的注解，判断当前登录用户有没有这个权限或者角色
 * @Component: 成都蜗牛学苑
 **/

@Component
public class AuthRolesInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //handler判断是部署一个方法：排除静态资源访问
        if(handler instanceof HandlerMethod){
            //拿到方法
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            //判断该方法是否存在这个注解，如果有这个注解表示需要进行权限判断
            if(method.isAnnotationPresent(RequireRoles.class)){
                RequireRoles annotation = method.getAnnotation(RequireRoles.class);
                //就已经获取到了对应执行的controller方法上的注解标注的参数值"order::add","order::edit"
                String[] roles = annotation.roles();

                for(String role : roles){
                    //获取请求头的token，然后，去数据库查询对应用户的权限，根据权限列表遍历比较，如果满足，则放行
                    if (role.equals(request.getHeader("role"))){
                        return true;
                    }
                }
            }else{
                //如果不需要判断权限，也应该放行
                return true;
            }
        }
        //所有权限比较都失败的时候，才会进入这里。
        return false;
    }
}
